/* Exercice 2 */ puissance_2(1). puissance_2(N) :- N>0, N mod 2=:= 0, M is N//2, puissance_2(M). existe_puissance_2([X|L]) :- (puissance_2(X), !); existe_puissance_2(L). pourtout_puissance_2([]). pourtout_puissance_2([X|L]) :- puissance_2(X), pourtout_puissance_2(L). exists(P,[X|L]) :- (Q=..[P,X],Q,!);exists(P,L). forall(_,[]). forall(P,[X|L]) :- Q=..[P,X],Q,forall(P,L). positif(X) :- X>0. forall_positif(L) :- forall(positif,L). exists_positif(L) :- exists(positif,L). exists_forall_positif(L) :- exists(forall_positif,L). forall_exists_positif(L) :- forall(exists_positif,L). /* Exercice 3 */ goldbach :- write('Donner un nombre pair plus grand que 3: '), nl, read(X), goldbach_aux(X). goldbach_aux(N) :- integer(N), N>3, N mod 2 =:= 0, !, P is N-2, verifie(P,N). goldbach_aux(X) :- write(X), write(' n\'est pas un nombre pair plus grand que 3.'). verifie(P,N) :- P>1, premier(P), Q is N-P, premier(Q), !, write(N), write(' est la somme des nombres premiers '), write(P), write(' et '), write(Q), write('.'). verifie(P,N) :- Q is P-1, Q>1, verifie(Q,N). premier(N) :- P is N//2, test_division(P,N). test_division(1,_):- !. test_division(P,N):- N mod P =\= 0, Q is P-1, test_division(Q,N). /* Exercice 3 */ move(N,M) :- N>0, (M is N//2; M is N-1). gagne(0). gagne(N) :- move(N,M), \+(gagne(M)).